// 引入 Tauri 的 http API 和 qs 库
import {
    fetch,
    ResponseType
} from '@tauri-apps/api/http';
import qs from 'qs';

// 检查 URL 是否为绝对路径
const isAbsoluteURL = (url) => /^([a-z][a-z\d+-.]*:)?\/\//i.test(url);

// 结合基础 URL 和相对 URL
const combineURLs = (baseURL, relativeURL) => {
    return relativeURL ?
        baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') :
        baseURL;
};

// 构建完整路径
const buildFullPath = (baseURL, requestedURL) => {
    if (baseURL && !isAbsoluteURL(requestedURL)) {
        return combineURLs(baseURL, requestedURL);
    }
    return requestedURL;
};

// 构建带有参数的 URL
const buildURL = (url, params) => {
    if (!params) {
        return url;
    }
    const serializedParams = qs.stringify(params);
    if (serializedParams) {
        url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
    }
    return url;
};

// 定义服务器和基础 URL
const server = '';
const baseURL = `${server}/api/v1`;

// 定义请求体类型
const BODY_TYPE = {
    Form: 'Form',
    Json: 'Json',
    Text: 'Text',
    Bytes: 'Bytes',
};

// 定义通用请求选项
const commonOptions = {
    timeout: 60,
    responseType: ResponseType.JSON,
};

// HTTP 请求函数
const http = (url, options = {}) => {
    const params = {
        ...options.params
    };
    if (!options.headers) options.headers = {};
    // 可以在此处添加 token 或 cookie 等信息到 headers

    if (options.body) {
        if (options.body.type === BODY_TYPE.Form) {
            options.headers['Content-Type'] = 'multipart/form-data';
        }
    }

    options = {
        ...commonOptions,
        ...options
    };

    return fetch(buildURL(buildFullPath(baseURL, url), params), options)
        .then(({
            status,
            data
        }) => {
            if (status >= 200 && status < 400) {
                return {
                    data
                };
            }
            return Promise.reject({
                status,
                data
            });
        })
        .catch((err) => {
            console.error(err);
            return Promise.reject(err);
        });
};

// 导出 http 函数
export default http;